package io.jee.runshan.domain.remote;

import io.jee.medusa.remote.RemoteConnector;
import io.jee.runshan.utils.PropertiesUtils;

import java.io.Serializable;
import java.util.Date;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class WeixinRequest implements Serializable {
	private static final long serialVersionUID = 8900180808072075800L;
	private static final String WeixinPropertiesFile = "weixin.properties";
	private static Logger logger = LoggerFactory.getLogger(WeixinRequest.class);
	
	/**
	 * 最新的Token
	 */
	private static String AccessToken;
	/**
	 * 最后一次获取Token的时间（毫秒）
	 */
	private static long AccessTokenGeted = 0L;
	/**
	 * 最后一次Token的有效时间（毫秒）
	 */
	private static long AccessTokenExpiresIn = 0L;
	
	/**
	 * 微信公众号AppID
	 */
	private static String AppID;
	
	/**
	 * 微信公众号AppSecret
	 */
	private static String AppSecret;
	
	/**
	 * 微信公众平台接口基本路劲
	 */
	private static String ApiBaseUrl;
	
	/**
	 * 微信公众平台接口获取Token地址
	 */
	private static String AppTokenUrl;
	
	private static Map<String, String> property = null;
	
	/**
	 * 获取最新Token
	 * @Created: 2015年1月17日
	 * @Last_modified: 2015年1月17日 下午11:09:49
	 * @Last_modified_by: ynshun
	 * @Create_by: ynshun
	 * 
	 * @return
	 */
	public static String token () {
		try {
			long currentTime = new Date().getTime();
			if (currentTime - AccessTokenExpiresIn > AccessTokenGeted) {
				AppTokenUrl = getProperty("AppTokenUrl") + "?grant_type=client_credential&appid=" + getAppID() + "&secret=" + getAppSecret();
				
				logger.debug("Send WebRequest Load AccessToken...");
				WeixinResponse response = RemoteConnector.get(AppTokenUrl, null);
				AccessToken = response.getAccess_token();
				AccessTokenExpiresIn = response.getExpires_in() * 1000;
				AccessTokenGeted = currentTime;
				logger.debug("Load AccessToken Done...");
			}
		} catch (Exception e) {
			logger.error("网络请求获取AccessToken失败：" + e.getMessage());
		}
		return AccessToken;
	}
	
	private static String getApiBaseUrl() {
		if (ApiBaseUrl == null) {
			ApiBaseUrl = getProperty("ApiBaseUrl");
		}
		return ApiBaseUrl;
	}
	
	private static String getAppID() {
		if (AppID == null) {
			AppID = getProperty("AppID");
		}
		return AppID;
	}
	
	private static String getAppSecret() {
		if (AppSecret == null) {
			AppSecret = getProperty("AppSecret");
		}
		return AppSecret;
	}
	
	public static String sendUrl (String action) {
		return getApiBaseUrl() + action + "?access_token=" + token();
	}
	
	/**
	 * 获取微信配置信息（包括国际化消息）
	 * @Created: 2015年1月17日
	 * @Last_modified: 2015年1月17日 下午11:10:00
	 * @Last_modified_by: ynshun
	 * @Create_by: ynshun
	 * 
	 * @param key
	 * @return
	 */
	public static String getProperty (String key) {
		if (property == null) {
			property = PropertiesUtils.toMap(PropertiesUtils.loadProperties(WeixinPropertiesFile));
			logger.debug("load WeiXin Properties File Success!!!");
		}
		return property.get(key);
	}
	
	/**
	 * 获取微信包括国际化消息
	 * @Created: 2015年1月17日
	 * @Last_modified: 2015年1月17日 下午11:42:57
	 * @Last_modified_by: ynshun
	 * @Create_by: ynshun
	 * 
	 * @param key
	 * @return
	 */
	public static String getProperty (Integer key) {
		if (property == null) {
			property = PropertiesUtils.toMap(PropertiesUtils.loadProperties(WeixinPropertiesFile));
			logger.debug("load WeiXin Properties File Success!!!");
		}
		return property.get(key);
	}
	
}